package com.luobo.msgsend.email;

import com.sun.mail.util.MailSSLSocketFactory;
import lombok.extern.slf4j.Slf4j;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.List;
import java.util.Properties;

/**
 * 邮件发送工具类。企业邮箱专用
 * 以下邮件中的配置参数，请在实际环境中，根据需要采取合适的配置方式。
 * 发送邮件依赖 com.sun.mail（1.6.1） 包、javax.mail（1.5.0-b01） 包。
 * 如果使用 Idea 运行，请将这两个包（可以直接到Maven目录下面去找）添加到项目的 Libraries 里面（快捷键：Ctrl + Alt + Shift + S）
 *
 * @author Zebe
 */
@Slf4j
public class SendEmailUtil {

    /**
     * 登录用户名
     */
    private final static String ACCOUNT = "admin@luobozww.com";

    /**
     * 登录密码
     */
    private final static String PASSWORD = "LUObo123#";

    /**
     * 邮件服务器地址
     */
    private final static String HOST = "smtp.exmail.qq.com";

    /**
     * 发信端口
     */
    private final static String PORT = "465";

    /**
     * 发信协议
     */
    private final static String PROTOCOL = "smtp";

    /**
     * 发件人别名（可以为空）
     */
    private String fromAliasName;

    /**
     * 收件人
     */
    private String to;

    /**
     * 主题
     */
    private String subject;

    /**
     * 内容
     */
    private String content;

    /**
     * 附件列表（可以为空）
     */
    private List<String> attachFileList;

    /**
     * 构造器
     *
     * @param fromAliasName  发件人别名
     * @param to             收件人
     * @param subject        主题
     * @param content        内容
     * @param attachFileList 附件列表
     */
    public SendEmailUtil(String fromAliasName, String to, String subject, String content, List<String> attachFileList) {
        this.fromAliasName = fromAliasName;
        this.to = to;
        this.subject = subject;
        this.content = content;
        this.attachFileList = attachFileList;
    }

    /**
     * 认证信息
     */
    static class MyAuthenticator extends Authenticator {

        /**
         * 用户名
         */
        String username = null;

        /**
         * 密码
         */
        String password = null;

        /**
         * 构造器
         *
         * @param username 用户名
         * @param password 密码
         */
        public MyAuthenticator(String username, String password) {
            this.username = username;
            this.password = password;
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
    }

    /**
     * 发送邮件
     */
    public void send() {
        try {
            Session session = initProperties();
            MimeMessage mimeMessage = new MimeMessage(session);
            // 设置发件人别名（如果未设置别名就默认为发件人邮箱）
            if (fromAliasName != null && !fromAliasName.trim().isEmpty()) {
                mimeMessage.setFrom(new InternetAddress(ACCOUNT, fromAliasName));
            }
            // 收件人
            mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            // 主题
            mimeMessage.setSubject(subject);
            // 时间
            mimeMessage.setSentDate(new Date());
            mimeMessage.setText(content);
            mimeMessage.saveChanges();
            Transport.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    //初始化参数
    public static Session initProperties() {
        Properties properties = new Properties();
        properties.setProperty("mail.transport.protocol", PROTOCOL);
        properties.setProperty("mail.smtp.host", HOST);
        properties.setProperty("mail.smtp.port", PORT);
        // 使用smtp身份验证
        properties.put("mail.smtp.auth", "true");
        // 使用SSL,企业邮箱必需 start
        // 开启安全协议
        MailSSLSocketFactory mailSSLSocketFactory = null;
        try {
            mailSSLSocketFactory = new MailSSLSocketFactory();
            mailSSLSocketFactory.setTrustAllHosts(true);
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
        properties.put("mail.smtp.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", mailSSLSocketFactory);
        properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        properties.put("mail.smtp.socketFactory.fallback", "false");
        properties.put("mail.smtp.socketFactory.port", PORT);
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(ACCOUNT, PASSWORD);
            }
        });
        // 使用SSL,企业邮箱必需 end
        // TODO 显示debug信息 正式环境注释掉
        //session.setDebug(true);
        return session;
    }

}
